package cn.swpu.blog.util;

import cn.swpu.blog.config.FtpConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;


import java.io.IOException;
import java.io.InputStream;

/**
 * @Author 冰翔
 * @Date Created in 1:02 下午 2020/12/18
 * 上传工具类
 */
@Slf4j
public class FtpUtil {

    /**
     * ftp上传文件方法
     *title:pictureUpload
     *@param ftpConfig  由spring管理的FtpConfig配置，在调用本方法时，可以在使用此方法的类中通过@AutoWared注入该属性。由于本方法是静态方法，所以不能在此注入该属性
     *@param newFileName 图片新名称--防止重名 例如："1.jpg"
     *@param picSavePath 图片保存路径。注：最后访问路径是 ftpConfig.getFTP_ADDRESS()+"/images"+picSavePath
     *@param inputStream 要上传的文件（图片）
     *@return 若上传成功，返回图片的访问路径，若上传失败，返回null
     * @throws IOException
     */
    public static String pictureUploadByConfig(FtpConfig ftpConfig, String newFileName,
                                               String picSavePath, InputStream inputStream) throws IOException {

        String picHttpPath = null;

        boolean flag = uploadFile(ftpConfig.getFtpAddress(), ftpConfig.getFtpPort(), ftpConfig.getFtpUserName(),
                ftpConfig.getFtpPassword(), ftpConfig.getFtpBasePath(), picSavePath, newFileName, inputStream);

        if (!flag) {
            log.error("picture upload failed......");
            return null;
        }

        picHttpPath = ftpConfig.getFtpBaseUrl() + picSavePath + newFileName;
        log.info("picture upload success ......");
        return picHttpPath;

    }

    /**
     *  实习向FTP服务器传输文件
     * @param host ftp主机
     * @param ftpPort ftp端口号
     * @param userName 登陆的用户
     * @param password 密码
     * @param basePath 基础目录
     * @param filePath 文件存储目录
     * @param fileName 文件名
     * @param input 流
     * @return true or false
     * @throws IOException
     */
    public static boolean uploadFile(String host, String ftpPort, String userName, String password, String basePath,
                                     String filePath, String fileName, InputStream input) throws IOException {

        int port = Integer.parseInt(ftpPort);
        boolean result = false;

        //创建ftp客户端
        FTPClient ftp = new FTPClient();

        try {
            int reply;

            //连接FTP服务器
            ftp.connect(host, port);

            //登陆
            ftp.login(userName, password);

            reply = ftp.getReplyCode();

            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }

            //切换到上传目录
            if (!ftp.changeWorkingDirectory(basePath+filePath)) {

                //如果不存在创建目录
                String[] dirs = filePath.split("/");
                String tempPath = basePath;
                for (String dir : dirs) {
                    if (null == dir || "".equals(dir)) {
                        continue;
                    }
                    tempPath += "/"+dir;
                    if (!ftp.changeWorkingDirectory(tempPath)) {
                        if (!ftp.makeDirectory(tempPath)) {
                            return result;
                        } else {
                            ftp.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }

            //设置上传文件类型，为二进制文件
            ftp.setFileType(FTP.BINARY_FILE_TYPE);

            //这个设置运行被动连接 -- 远程连接时需要
            ftp.enterLocalPassiveMode();

            //上传文件
            if (!ftp.storeFile(fileName, input)) {
                return result;
            }

            input.close();
            ftp.logout();
            result = true;

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                ftp.disconnect();
            }
        }

        return result;
    }

}
